home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / comm / tcp / Amster.lha / Amster_Install / Source / prefs.c < prev    next >
C/C++ Source or Header  |  2000-07-25  |  33KB  |  1,022 lines

  1. /*
  2. ** Preferences
  3. */
  4.  
  5. #include "include/config.h"
  6.  
  7. #include <stdio.h>
  8. #include <stdarg.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11.  
  12. #include "include/mui.h"
  13. #include <mui/NListview_mcc.h>
  14. #include <libraries/asl.h>
  15.  
  16. #include <proto/dos.h>
  17.  
  18. #include "include/download.h"
  19. #include "include/gui.h"
  20. #include "include/search.h"
  21. #include "include/panel.h"
  22. #include "include/prefs.h"
  23. #include "include/share.h"
  24. #include "amster_Cat.h"
  25. #include "include/protos.h"
  26.  
  27. struct prefsdata myprefs;
  28. struct prefsdata *prf = &myprefs;
  29.  
  30. int prf_eventflags[] = { 3, 0, 3, 3, 3, 3, 3, 1 };
  31.  
  32. static struct MUI_CustomClass *QueueClass;
  33.  
  34. MUIF QueueDispatcher(REG(a0) struct IClass *cl, REG(a2) Object *obj, REG(a1) Msg msg);
  35. ULONG prf_new(struct IClass *cl, Object *obj, struct opSet *msg);
  36. void prf_set(struct prfdata *data);
  37. void prf_use(struct prfdata *data);
  38. void snd_play(char *fname);
  39. void prf_entry(struct prfdata *data);
  40.  
  41.  
  42. MUIF prf_dispatch(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg)
  43. {
  44.     struct prfdata *data = INST_DATA(cl,obj);
  45.  
  46.     switch(msg->MethodID) {
  47.         case OM_NEW:
  48.             return(prf_new(cl,obj,(APTR)msg));
  49.         case OM_DISPOSE:
  50.             if (QueueClass) MUI_DeleteCustomClass(QueueClass);
  51.             return(DoSuperMethodA(cl, obj, msg));
  52.         case PRF_UPDATE:
  53.             if (gui_onlinestate == ONLINE) nap_sendbuf(NAPC_EMAILCHANGE,prf->email);
  54.             else MUI_Request(gui->app, gui->swin, 0L, (char *)MSG_ERROR_TITLE, (char *)MSG_OK_GAD, (char *)MSG_ERROR_UPDATEEMAIL);
  55.             return NULL;
  56.         case PRF_OPEN:
  57.             prf_set(data);
  58.             set(obj,MUIA_Window_Open,TRUE);
  59.             return NULL;
  60.         case PRF_USE:
  61.             prf_use(data);
  62.             set(obj,MUIA_Window_Open,FALSE);
  63.             return NULL;
  64.         case PRF_LASTSAVED:
  65.             {
  66.             u_long tmp;
  67.             prf_setup(0, NULL);
  68.             if (prf_load("ENVARC:"AMSTER_PREFS)) {
  69.                 DoMethod(gui->searchpanel, SEARCH_SET);
  70.                 GetAttr(MUIA_Window_Open, obj, &tmp);
  71.                 if (tmp==TRUE) prf_set(data);
  72.             }
  73.             return NULL;
  74.             }
  75.         case PRF_SAVE:
  76.             prf_use(data);
  77.             set(obj,MUIA_Window_Open,FALSE);
  78.             prf_save("ENVARC:"AMSTER_PREFS);
  79.             return NULL;
  80.         case PRF_SAVEALL:
  81.             {
  82.             u_long tmp;
  83.             GetAttr(MUIA_Window_Open, obj, &tmp);
  84.             if (tmp==TRUE) {
  85.                 prf_use(data);
  86.             }
  87.             else prf_save("ENV:"AMSTER_PREFS);
  88.             prf_save("ENVARC:"AMSTER_PREFS);
  89.             return NULL;
  90.             }
  91.         case PRF_CANCEL:
  92.             set(obj, MUIA_Window_Open, FALSE);
  93.             return NULL;
  94.         case PRF_TESTSND:
  95.             {
  96.             u_long tmp;
  97.             GetAttr(MUIA_String_Contents, data->EventSoundString, &tmp);
  98.             if (((char *)tmp)[0] != '\0') snd_play((char *)tmp);
  99.             return NULL;
  100.             }
  101.         case PRF_FIREWALL:
  102.             {
  103.             u_long tmp;
  104.             GetAttr(MUIA_Selected, data->FirewallToggle, &tmp);
  105.             if (tmp==TRUE)
  106.                 set(data->PortString, MUIA_Disabled, TRUE);
  107.             else
  108.                 set(data->PortString, MUIA_Disabled, FALSE);
  109.  
  110.             return NULL;
  111.             }
  112.         case PRF_ENTRY:
  113.             prf_entry(data);
  114.             return NULL;
  115.         case PRF_VALIDDELAY:
  116.             {
  117.             u_long tmp;
  118.             GetAttr(MUIA_String_Integer, data->ST_QueueDelay, &tmp);
  119.             if ((int)tmp < 1) set(data->ST_QueueDelay, MUIA_String_Integer, prf->QueueDelay);
  120.             return NULL;
  121.             }
  122.     }
  123.     return DoSuperMethodA(cl, obj, msg);
  124. }
  125.  
  126.  
  127. /*
  128. ** This is the Queue custom class, a sub class of Slider.mui. Overrides the
  129. ** MUIM_Numeric_Stringify method to implement custom display in slider gadget.
  130. */
  131.  
  132. MUIF QueueDispatcher(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg)
  133. {
  134.     if (msg->MethodID==MUIM_Numeric_Stringify)
  135.     {
  136.         struct QueueData *data = INST_DATA(cl,obj);
  137.         struct MUIP_Numeric_Stringify *m = (APTR)msg;
  138.  
  139.         if (m->value<26)
  140.         {
  141.             sprintf(data->buf,"%3ld", m->value);
  142.         }
  143.         else
  144.         {
  145.             strcpy(data->buf, MSG_PRF_QUEUE_UNLIMITED);
  146.         }
  147.         return((ULONG)data->buf);
  148.     }
  149.     return(DoSuperMethodA(cl,obj,msg));
  150. }
  151.  
  152.  
  153. ULONG prf_new(struct IClass *cl, Object *obj, struct opSet *msg)
  154. {
  155.     static char *pages[] = {
  156.         (char *)_MSG_PRF_USER_TAB,
  157.         (char *)_MSG_PRF_OPTIONS_TAB,
  158.         (char *)_MSG_PRF_EVENTS_TAB,
  159.         (char *)_MSG_PRF_ADVANCED_TAB,
  160.         NULL
  161.     };
  162.     static char *events[] = {
  163.         (char *)_MSG_PRF_EVT_START,
  164.         (char *)_MSG_PRF_EVT_EXIT,
  165.         (char *)_MSG_PRF_EVT_CONN,
  166.         (char *)_MSG_PRF_EVT_DISC,
  167.         (char *)_MSG_PRF_EVT_DLFIN,
  168.         (char *)_MSG_PRF_EVT_ULFIN,
  169.         (char *)_MSG_PRF_EVT_DLERR,
  170.         (char *)_MSG_PRF_EVT_PLAY,
  171.         NULL
  172.     };
  173.     static char *lamps[] = {
  174.         (char *)_MSG_PRF_LAMPLAMP,
  175.         (char *)_MSG_PRF_LAMPTWF,
  176.         NULL
  177.     };
  178.     static char *ServerListOpts[] = {
  179.         (char *)_MSG_PRF_SERVERLIST_FORGET,
  180.         (char *)_MSG_PRF_SERVERLIST_SAVE,
  181.         (char *)_MSG_PRF_SERVERLIST_CACHE,
  182.         NULL
  183.     };
  184.     static char *AutoCleanupOpts[] = {
  185.         (char *)_MSG_PRF_AUTOCLEANUP_NONE,
  186.         (char *)_MSG_PRF_AUTOCLEANUP_DOWNLOADS,
  187.         (char *)_MSG_PRF_AUTOCLEANUP_UPLOADS,
  188.         (char *)_MSG_PRF_AUTOCLEANUP_BOTH,
  189.         NULL
  190.     };
  191.  
  192.     struct prfdata *data;
  193.     Object *UserString, *PasswordString, *EMailString, *EMailButton, *DownloadPathString, *LinkSpeedCycle;
  194.     Object *ClearListToggle, *AutoConnectToggle, *AskFileToggle, *AutoSaveToggle, *AutoAddToggle;
  195.     Object *LampCycle, *CY_ServerList, *CY_AutoCleanup, *ST_NameLength;
  196.     Object *EventList, *EventScriptString, *EventSoundString, *EventTestButton;
  197.     Object *MetaServerString, *ServerString, *PortString, *FirewallToggle;
  198. /*    Object *VersionString;*/
  199.     Object *DownloadQueueSlider, *UploadQueueSlider, *DownloadPriSlider, *UploadPriSlider;
  200.     Object *ST_QueueRetries, *ST_QueueDelay;
  201.     Object *SaveButton, *UseButton, *CancelButton;
  202.  
  203.     QueueClass = MUI_CreateCustomClass(NULL, MUIC_Slider, NULL, sizeof(struct QueueData), QueueDispatcher);
  204.  
  205.     if (pages[0] == (char *)_MSG_PRF_USER_TAB)
  206.         localize_array(pages);
  207.     if (events[0] == (char *)_MSG_PRF_EVT_START)
  208.         localize_array(events);
  209.     if (lamps[0] == (char *)_MSG_PRF_LAMPLAMP)
  210.         localize_array(lamps);
  211.     if (ServerListOpts[0] == (char *)_MSG_PRF_SERVERLIST_FORGET)
  212.         localize_array(ServerListOpts);
  213.     if (AutoCleanupOpts[0] == (char *)_MSG_PRF_AUTOCLEANUP_NONE)
  214.         localize_array(AutoCleanupOpts);
  215.  
  216.     if (obj = (Object *)DoSuperNew(cl, obj,
  217.         MUIA_HelpNode, "config",
  218.         MUIA_Window_Title, MSG_PRF_TITLE,
  219.         MUIA_Window_ID, MAKE_ID('S','E','T','T'),
  220.         WindowContents, VGroup,
  221.             Child, RegisterGroup(pages),
  222.             Child, VGroup,
  223.                 Child, ColGroup(2), GroupFrameT(MSG_PRF_ACCOUNT_FRAME),
  224.                     MUIA_HelpNode, "conf-user",
  225.                     Child, Label2(MSG_PRF_USERNAME),
  226.                     Child, UserString = StringObject,
  227.                         StringFrame,
  228.                         MUIA_String_Reject, ":%$ ",
  229.                         MUIA_String_AdvanceOnCR, TRUE,
  230.                         MUIA_CycleChain, 1,
  231.                         MUIA_ShortHelp, MSG_PRF_USERNAME_HELP,
  232.                     End,
  233.                     Child, Label2(MSG_PRF_PASSWORD),
  234.                     Child, PasswordString = StringObject,
  235.                         StringFrame,
  236.                         MUIA_String_Reject, " ",
  237.                         MUIA_String_AdvanceOnCR, TRUE,
  238.                         MUIA_String_Secret, TRUE,
  239.                         MUIA_CycleChain, 1,
  240.                         MUIA_ShortHelp, MSG_PRF_PASSWORD_HELP,
  241.                     End,
  242.                     Child, Label2(MSG_PRF_EMAIL),
  243.                     Child, HGroup,
  244.                         Child, EMailString = StringObject,
  245.                             StringFrame,
  246.                             MUIA_HorizWeight, 150,
  247.                             MUIA_String_AdvanceOnCR, TRUE,
  248.                             MUIA_CycleChain, 1,
  249.                             MUIA_ShortHelp, MSG_PRF_EMAIL_HELP,
  250.                         End,
  251.                         Child, EMailButton = SimpleButton(MSG_PRF_UPDATE_GAD),
  252.                             MUIA_ShortHelp, MSG_PRF_UPDATE_HELP,
  253.                     End,
  254.                     Child, Label2(MSG_PRF_CONNECTION),
  255.                     Child, LinkSpeedCycle = CycleObject,
  256.                         MUIA_Cycle_Active, prf->link,
  257.                         MUIA_Cycle_Entries, nap_linktype,
  258.                         MUIA_ShortHelp, MSG_PRF_CONNECTION_HELP,
  259.                     End,
  260.                 End,
  261.                 Child, ColGroup(2),
  262.                     Child, Label2(MSG_PRF_DLPATH),
  263.                     Child, HGroup,
  264.                         Child, DownloadPathString = PopaslObject,
  265.                             MUIA_Popstring_String, StringObject,
  266.                                 StringFrame,
  267.                                 MUIA_String_MaxLen, 256,
  268.                                 MUIA_CycleChain, 1,
  269.                                 MUIA_ShortHelp, MSG_PRF_DLPATH_HELP,
  270.                             End,
  271.                             MUIA_Popstring_Button, PopButton(MUII_PopFile),
  272.                             MUIA_Popasl_Type, ASL_FileRequest,
  273.                             ASLFR_TitleText, MSG_PRF_DLPATH_REQ,
  274.                             ASLFR_DrawersOnly, TRUE,
  275.                         End,
  276.                         Child, Label2(MSG_PRF_NAMELENGTH),
  277.                         Child, ST_NameLength = StringObject,
  278.                             StringFrame,
  279.                             MUIA_HorizWeight, 25,
  280.                             MUIA_String_Integer, prf->NameLength,
  281.                             MUIA_String_Accept, "0123456789",
  282.                             MUIA_String_MaxLen, 4,
  283.                             MUIA_CycleChain, 1,
  284.                             MUIA_ShortHelp, MSG_PRF_NAMELENGTH_HELP,
  285.                         End,
  286.                     End,
  287.                 End,
  288.             End,
  289.             Child, VGroup,
  290.                 MUIA_HelpNode, "conf-opts",
  291.                 Child, VGroup, GroupFrameT(MSG_PRF_MISC_FRAME),
  292.                     Child, maketoggle(MSG_PRF_AUTOCONNECT,  &AutoConnectToggle),
  293.                     Child, maketoggle(MSG_PRF_CLEARLIST,    &ClearListToggle  ),
  294.                     Child, maketoggle(MSG_PRF_ALWAYSASK,    &AskFileToggle    ),
  295.                     Child, maketoggle(MSG_PRF_ADDTOLIBRARY, &AutoAddToggle    ),
  296.                     Child, maketoggle(MSG_PRF_AUTOSAVELIB,  &AutoSaveToggle   ),
  297.                 End,
  298.                 Child, ColGroup(2),
  299.                     Child, Label2(MSG_PRF_AUTOCLEANUP_TMP),
  300.                     Child, CY_AutoCleanup = CycleObject,
  301.                         MUIA_Cycle_Active, prf->AutoCleanup,
  302.                         MUIA_Cycle_Entries, AutoCleanupOpts,
  303.                         MUIA_ShortHelp, MSG_PRF_AUTOCLEANUP_HELP,
  304.                     End,
  305.                     Child, Label2(MSG_PRF_SERVERLIST),
  306.                     Child, CY_ServerList = CycleObject,
  307.                         MUIA_Cycle_Active, prf->ServerList,
  308.                         MUIA_Cycle_Entries, ServerListOpts,
  309.                         MUIA_ShortHelp, MSG_PRF_SERVERLIST_HELP,
  310.                     End,
  311.                     Child, Label2(MSG_PRF_LAMPCLASS),
  312.                     Child, LampCycle = CycleObject,
  313.                         MUIA_Cycle_Active, prf->lamps,
  314.                         MUIA_Cycle_Entries, lamps,
  315.                         MUIA_ShortHelp, MSG_PRF_LAMPCLASS_HELP,
  316.                     End,
  317.                 End,
  318.             End,
  319.             Child, VGroup,
  320.                 MUIA_HelpNode, "conf-events",
  321.                 Child, NListviewObject,
  322.                     MUIA_NListview_NList, EventList = NListObject,
  323.                         InputListFrame,
  324.                         MUIA_NList_SourceArray, events,
  325.                     End,
  326.                 End,
  327.                 Child, ColGroup(2),
  328.                     Child, Label2(MSG_PRF_COMMAND),
  329.                     Child, EventScriptString = PopaslObject,
  330.                         MUIA_Popstring_String, StringObject,
  331.                             StringFrame,
  332.                             MUIA_String_MaxLen, 256,
  333.                             MUIA_CycleChain, 1,
  334.                             MUIA_ShortHelp, MSG_PRF_COMMAND_HELP,
  335.                         End,
  336.                         MUIA_Popstring_Button, PopButton(MUII_PopFile),
  337.                         MUIA_Popasl_Type, ASL_FileRequest,
  338.                         ASLFR_TitleText, MSG_PRF_SCRIPT_REQ,
  339.                     End,
  340.                     Child, Label2(MSG_PRF_SOUND),
  341.                     Child, HGroup,
  342.                         Child, EventSoundString = PopaslObject,
  343.                             MUIA_HorizWeight, 300,
  344.                             MUIA_Popstring_String, StringObject,
  345.                                 StringFrame,
  346.                                 MUIA_String_MaxLen, 256,
  347.                                 MUIA_CycleChain, 1,
  348.                             End,
  349.                             MUIA_Popstring_Button, PopButton(MUII_PopFile),
  350.                             MUIA_Popasl_Type, ASL_FileRequest,
  351.                             ASLFR_TitleText, MSG_PRF_SOUND_REQ,
  352.                         End,
  353.                         Child, EventTestButton = SimpleButton(MSG_PRF_SOUNDTEST_GAD),
  354.                     End,
  355.                 End,
  356.             End,
  357.             Child, VGroup,
  358.                 Child, VGroup, GroupFrameT(MSG_PRF_NETWORK_FRAME),
  359.                     Child, ColGroup(2),
  360.                         MUIA_HelpNode, "conf-adv",
  361.                         Child, Label2(MSG_PRF_MAINSERVER),
  362.                         Child, MetaServerString = StringObject,
  363.                             StringFrame,
  364.                             MUIA_String_AdvanceOnCR, TRUE,
  365.                             MUIA_CycleChain, 1,
  366.                             MUIA_ShortHelp, MSG_PRF_MAINSERVER_HELP,
  367.                         End,
  368.                         Child, Label2(MSG_PRF_MP3SERVER),
  369.                         Child, ServerString = StringObject,
  370.                             StringFrame,
  371.                             MUIA_String_AdvanceOnCR, TRUE,
  372.                             MUIA_CycleChain, 1,
  373.                             MUIA_ShortHelp, MSG_PRF_MP3SERVER_HELP,
  374.                         End,
  375. /*
  376.                         Child, Label2(MSG_PRF_VERSION),
  377.                         Child, VersionString = StringObject,
  378.                             StringFrame,
  379.                             MUIA_CycleChain, 1,
  380.                         End,
  381. */
  382.                         Child, Label2(MSG_PRF_LISTENPORT),
  383.                         Child, HGroup,
  384.                             Child, PortString = StringObject,
  385.                                 StringFrame,
  386.                                 MUIA_HorizWeight, 90,
  387.                                 MUIA_String_Integer, prf->port,
  388.                                 MUIA_String_Accept, "0123456789",
  389.                                 MUIA_String_MaxLen, 6,
  390.                                 MUIA_CycleChain, 1,
  391.                                 MUIA_ShortHelp, MSG_PRF_LISTENPORT_HELP,
  392.                             End,
  393.                             Child, Label2(MSG_PRF_BEHINDFW),
  394.                             Child, FirewallToggle = ImageObject,
  395.                                 ButtonFrame,
  396.                                 MUIA_HorizWeight, 10,
  397.                                 MUIA_Background, MUII_ButtonBack,
  398.                                 MUIA_InputMode, MUIV_InputMode_Toggle,
  399.                                 MUIA_ShowSelState, FALSE,
  400.                                 MUIA_Image_Spec, "6:15",
  401.                                 MUIA_Selected, FALSE,
  402.                                 MUIA_ShortHelp, MSG_PRF_BEHINDFW_HELP,
  403.                             End,
  404.                         End,
  405.                     End,
  406.                 End,
  407.                 Child, VGroup, GroupFrameT(MSG_PRF_TRANSFER_FRAME),
  408.                     Child, ColGroup(4),
  409.                         Child, Label2(MSG_PRF_DLQUEUE),
  410.                         Child, DownloadQueueSlider = NewObject(QueueClass->mcc_Class, 0,
  411.                             MUIA_Slider_Min, 1,
  412.                             MUIA_Slider_Max, 26,
  413.                             MUIA_Numeric_Value, 26,
  414.                             MUIA_CycleChain, 1,
  415.                             MUIA_ShortHelp, MSG_PRF_DLQUEUE_HELP,
  416.                             TAG_DONE),
  417.                         Child, Label2(MSG_PRF_TASKPRI),
  418.                         Child, DownloadPriSlider = NumericbuttonObject,
  419.                             MUIA_Numeric_Min, -128,
  420.                             MUIA_Numeric_Max, 0,
  421.                             MUIA_ShortHelp, MSG_PRF_TASKPRI_HELP,
  422.                         End,
  423.                         Child, Label2(MSG_PRF_ULQUEUE),
  424.                         Child, UploadQueueSlider = NewObject(QueueClass->mcc_Class, 0,
  425.                             MUIA_Slider_Min, 0,
  426.                             MUIA_Slider_Max, 26,
  427.                             MUIA_Numeric_Value, 5,
  428.                             MUIA_CycleChain, 1,
  429.                             MUIA_ShortHelp, MSG_PRF_ULQUEUE_HELP,
  430.                             TAG_DONE),
  431.                         Child, Label2(MSG_PRF_TASKPRI),
  432.                         Child, UploadPriSlider = NumericbuttonObject,
  433.                             MUIA_Numeric_Min, -128,
  434.                             MUIA_Numeric_Max, 0,
  435.                             MUIA_ShortHelp, MSG_PRF_TASKPRI_HELP,
  436.                         End,
  437.                     End,
  438.                     Child, HGroup,
  439.                         Child, Label2(MSG_PRF_RETRIES),
  440.                         Child, ST_QueueRetries = StringObject,
  441.                             StringFrame,
  442.                             MUIA_String_Integer, prf->QueueRetries,
  443.                             MUIA_String_Accept, "0123456789",
  444.                             MUIA_String_MaxLen, 6,
  445.                             MUIA_CycleChain, 1,
  446.                             MUIA_ShortHelp, MSG_PRF_RETRIES_HELP,
  447.                         End,
  448.                         Child, Label2(MSG_PRF_RETRYDELAY),
  449.                         Child, ST_QueueDelay = StringObject,
  450.                             StringFrame,
  451.                             MUIA_String_Integer, prf->QueueDelay,
  452.                             MUIA_String_Accept, "0123456789",
  453.                             MUIA_String_MaxLen, 6,
  454.                             MUIA_CycleChain, 1,
  455.                             MUIA_ShortHelp, MSG_PRF_RETRYDELAY_HELP,
  456.                         End,
  457.                     End,
  458.                 End,
  459.             End,
  460.             End,
  461.             Child, HGroup,
  462.                 Child, SaveButton   = SimpleButton(MSG_PRF_SAVE_GAD  ),
  463.                 Child, UseButton    = SimpleButton(MSG_PRF_USE_GAD   ),
  464.                 Child, CancelButton = SimpleButton(MSG_PRF_CANCEL_GAD),
  465.             End,
  466.  
  467.         End,
  468.         TAG_MORE, msg->ops_AttrList))
  469.     {
  470.         data = INST_DATA(cl,obj);
  471.  
  472.         data->UserString          = UserString;
  473.         data->PasswordString      = PasswordString;
  474.         data->EMailString         = EMailString;
  475.         data->DownloadPathString  = DownloadPathString;
  476.         data->LinkSpeedCycle      = LinkSpeedCycle;
  477.  
  478.         data->ClearListToggle     = ClearListToggle;
  479.         data->AutoConnectToggle   = AutoConnectToggle;
  480.         data->AskFileToggle       = AskFileToggle;
  481.         data->AutoSaveToggle      = AutoSaveToggle;
  482.         data->AutoAddToggle       = AutoAddToggle;
  483.         data->LampCycle           = LampCycle;
  484.         data->CY_ServerList       = CY_ServerList;
  485.         data->CY_AutoCleanup      = CY_AutoCleanup;
  486.         data->ST_NameLength       = ST_NameLength;
  487.  
  488.         data->EventList           = EventList;
  489.         data->EventScriptString   = EventScriptString;
  490.         data->EventSoundString    = EventSoundString;
  491.  
  492.         data->MetaServerString    = MetaServerString;
  493.         data->ServerString        = ServerString;
  494. /*        data->VersionString       = VersionString;*/
  495.         data->PortString          = PortString;
  496.         data->FirewallToggle      = FirewallToggle;
  497.         data->DownloadQueueSlider = DownloadQueueSlider;
  498.         data->DownloadPriSlider   = DownloadPriSlider;
  499.         data->UploadQueueSlider   = UploadQueueSlider;
  500.         data->UploadPriSlider     = UploadPriSlider;
  501.         data->ST_QueueRetries     = ST_QueueRetries;
  502.         data->ST_QueueDelay       = ST_QueueDelay;
  503.  
  504.         data->lastitem = -1;
  505.  
  506.         DoMethod(EMailButton,     MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, PRF_UPDATE);
  507.         DoMethod(EventList,       MUIM_Notify, MUIA_NList_EntryClick, MUIV_EveryTime, obj, 1, PRF_ENTRY);
  508.         DoMethod(EventTestButton, MUIM_Notify, MUIA_Pressed, FALSE, obj, 1, PRF_TESTSND);
  509.         DoMethod(FirewallToggle,  MUIM_Notify, MUIA_Selected, MUIV_EveryTime, obj, 1, PRF_FIREWALL);
  510.  
  511.         DoMethod(ST_QueueDelay,   MUIM_Notify, MUIA_String_Acknowledge, MUIV_EveryTime, obj, 1, PRF_VALIDDELAY);
  512.  
  513.         DoMethod(SaveButton,     MUIM_Notify, MUIA_Pressed, FALSE, gui->iconpanel, 2, PANEL_CLOSEPRF, PRF_SAVE  );
  514.         DoMethod(UseButton,      MUIM_Notify, MUIA_Pressed, FALSE, gui->iconpanel, 2, PANEL_CLOSEPRF, PRF_USE   );
  515.         DoMethod(CancelButton,   MUIM_Notify, MUIA_Pressed, FALSE, gui->iconpanel, 2, PANEL_CLOSEPRF, PRF_CANCEL);
  516.  
  517.         DoMethod(obj, MUIM_Notify, MUIA_Window_CloseRequest, TRUE, gui->iconpanel, 2, PANEL_CLOSEPRF, PRF_CANCEL);
  518.  
  519.         return((ULONG)obj);
  520.     }
  521.     return(0);
  522. }
  523.  
  524.  
  525. void prf_set(struct prfdata *data)
  526. {
  527.     set(data->UserString,         MUIA_String_Contents, prf->user);
  528.     set(data->PasswordString,     MUIA_String_Contents, prf->pass);
  529.     set(data->EMailString,        MUIA_String_Contents, prf->email);
  530.     set(data->DownloadPathString, MUIA_String_Contents, prf->dlpath);
  531.     set(data->LinkSpeedCycle,     MUIA_Cycle_Active,    prf->link);
  532.  
  533.     set(data->ClearListToggle,   MUIA_Selected,       prf->clrlist);
  534.     set(data->AutoConnectToggle, MUIA_Selected,       prf->autocon);
  535.     set(data->AskFileToggle,     MUIA_Selected,       prf->askfile);
  536.     set(data->AutoAddToggle,     MUIA_Selected,       prf->autoadd);
  537.     set(data->AutoSaveToggle,    MUIA_Selected,       prf->autosave);
  538.     set(data->LampCycle,         MUIA_Cycle_Active,   prf->lamps);
  539.     set(data->CY_ServerList,     MUIA_Cycle_Active,   prf->ServerList);
  540.     set(data->CY_AutoCleanup,    MUIA_Cycle_Active,   prf->AutoCleanup);
  541.     set(data->ST_NameLength,     MUIA_String_Integer, prf->NameLength);
  542.  
  543.     set(data->MetaServerString, MUIA_String_Contents, prf->mainserver);
  544.     set(data->ServerString,     MUIA_String_Contents, prf->server);
  545. /*    set(data->VersionString,    MUIA_String_Contents, prf->napvers);*/
  546.     set(data->PortString, MUIA_String_Integer, prf->port);
  547.     if (prf->port)
  548.         set(data->FirewallToggle, MUIA_Selected, FALSE);
  549.     else {
  550.         set(data->FirewallToggle, MUIA_Selected, TRUE);
  551.         set(data->PortString, MUIA_String_Integer, PRF_DEFAULT_PORT);
  552.     }
  553.     set(data->DownloadQueueSlider, MUIA_Numeric_Value,  prf->DownloadQueueLimit);
  554.     set(data->DownloadPriSlider,   MUIA_Numeric_Value,  prf->DownloadTaskPri   );
  555.     set(data->UploadQueueSlider,   MUIA_Numeric_Value,  prf->UploadQueueLimit  );
  556.     set(data->UploadPriSlider,     MUIA_Numeric_Value,  prf->UploadTaskPri     );
  557.     set(data->ST_QueueRetries,     MUIA_String_Integer, prf->QueueRetries      );
  558.     set(data->ST_QueueDelay,       MUIA_String_Integer, prf->QueueDelay        );
  559. }
  560.  
  561.  
  562. void prf_use(struct prfdata *data)
  563. {
  564.     u_long tmp, tmp2;
  565.  
  566.     /* Advanced */
  567.  
  568.     GetAttr(MUIA_String_Contents, data->MetaServerString, &tmp);
  569.     if (((char*)tmp)[0]==0) prf->mainserver=NULL; else prf->mainserver=strdup((char*)tmp);
  570.  
  571.     GetAttr(MUIA_String_Contents, data->ServerString, &tmp);
  572.     if (((char*)tmp)[0]==0) prf->server=NULL; else prf->server=strdup((char*)tmp);
  573.  
  574. /*
  575.     GetAttr(MUIA_String_Contents, data->VersionString, &tmp);
  576.     if (((char*)tmp)[0]==0) prf->napvers=NULL; else prf->napvers=strdup((char*)tmp);
  577. */
  578.  
  579.     GetAttr(MUIA_Selected, data->FirewallToggle, &tmp);
  580.     if (!tmp) {
  581.         GetAttr(MUIA_String_Integer, data->PortString, &tmp);
  582.         prf->port = (int)tmp;
  583.     }
  584.     else prf->port = 0;
  585.  
  586.     GetAttr(MUIA_Numeric_Value, data->DownloadQueueSlider, &tmp);
  587.     if (tmp > prf->DownloadQueueLimit) {
  588.         /* Limit was raised, so we check the queue right away */
  589.         prf->DownloadQueueLimit = tmp;
  590.         DoMethod(gui->dwin, DL_CHECKQUEUE);
  591.     }
  592.     else prf->DownloadQueueLimit = tmp;
  593.  
  594.     GetAttr(MUIA_Numeric_Value, data->DownloadPriSlider, &tmp);
  595.     prf->DownloadTaskPri = tmp;
  596.  
  597.     GetAttr(MUIA_Numeric_Value, data->UploadQueueSlider, &tmp);
  598.     prf->UploadQueueLimit = tmp;
  599.  
  600.     GetAttr(MUIA_Numeric_Value, data->UploadPriSlider, &tmp);
  601.     prf->UploadTaskPri = tmp;
  602.  
  603.     GetAttr(MUIA_String_Integer, data->ST_QueueRetries, &tmp);
  604.     prf->QueueRetries = (int)tmp;
  605.  
  606.     GetAttr(MUIA_String_Integer, data->ST_QueueDelay, &tmp);
  607.     if ((int)tmp > 0) {
  608.         prf->QueueDelay = (int)tmp;
  609.         DoMethod(gui->dwin, DL_SETDELAY, prf->QueueDelay);
  610.     }
  611.  
  612.     /* User */
  613.  
  614.     GetAttr(MUIA_String_Contents, data->UserString, &tmp);
  615.     if (((char*)tmp)[0]==0) prf->user=NULL; else prf->user=strdup((char*)tmp);
  616.  
  617.     GetAttr(MUIA_String_Contents, data->PasswordString, &tmp);
  618.     if (((char*)tmp)[0]==0) prf->pass=NULL; else prf->pass=strdup((char*)tmp);
  619.  
  620.     GetAttr(MUIA_String_Contents, data->EMailString, &tmp);
  621.     if (((char*)tmp)[0]==0) prf->email=NULL; else prf->email=strdup((char*)tmp);
  622.  
  623.     GetAttr(MUIA_String_Contents, data->DownloadPathString, &tmp);
  624.     if (((char *)tmp)[0] == 0) prf->dlpath=NULL;
  625.     else {
  626.         prf->dlpath=strdup((char*)tmp);
  627.         DoMethod(gui->shwin, SHARE_SETDIR, prf->dlpath);
  628.     }
  629.  
  630.     /* Options */
  631.  
  632.     GetAttr(MUIA_Cycle_Active, data->LinkSpeedCycle, &tmp);
  633.     prf->link = tmp;
  634.  
  635.     GetAttr(MUIA_Selected, data->ClearListToggle, &tmp);
  636.     prf->clrlist = tmp;
  637.  
  638.     GetAttr(MUIA_Selected, data->AutoConnectToggle, &tmp);
  639.     prf->autocon = tmp;
  640.  
  641.     GetAttr(MUIA_Selected, data->AskFileToggle, &tmp);
  642.     prf->askfile = tmp;
  643.  
  644.     GetAttr(MUIA_Selected, data->AutoAddToggle, &tmp);
  645.     prf->autoadd = tmp;
  646.  
  647.     GetAttr(MUIA_Selected, data->AutoSaveToggle, &tmp);
  648.     prf->autosave = tmp;
  649.  
  650.     GetAttr(MUIA_Cycle_Active, data->LampCycle, &tmp);
  651.     prf->lamps = tmp;
  652.  
  653.     GetAttr(MUIA_Cycle_Active, data->CY_AutoCleanup, &tmp);
  654.     prf->AutoCleanup = tmp;
  655.  
  656.     GetAttr(MUIA_Cycle_Active, data->CY_ServerList, &tmp);
  657.     prf->ServerList = tmp;
  658.  
  659.     GetAttr(MUIA_String_Integer, data->ST_NameLength, &tmp);
  660.     if ((int)tmp > 7 && (int)tmp < 108) prf->NameLength = (int)tmp;
  661.  
  662.     /* Events */
  663.  
  664.     GetAttr(MUIA_NList_Active, data->EventList, &tmp);
  665.     if (tmp != MUIV_NList_Active_Off) {
  666.         if (prf_eventflags[tmp]&1) {
  667.             GetAttr(MUIA_String_Contents, data->EventScriptString, &tmp2);
  668.             if (((char*)tmp2)[0]==0) prf->scripts[tmp]=NULL;
  669.             else prf->scripts[tmp]=strdup((char*)tmp2);
  670.         }
  671.         if (prf_eventflags[tmp]&2) {
  672.             GetAttr(MUIA_String_Contents, data->EventSoundString, &tmp2);
  673.             if (((char*)tmp2)[0]==0) prf->sounds[tmp]=NULL;
  674.             else prf->sounds[tmp]=strdup((char*)tmp2);
  675.         }
  676.     }
  677.  
  678.     prf_save("ENV:"AMSTER_PREFS);
  679. }
  680.  
  681.  
  682. void prf_setup(int argc, char *argv[])
  683. {
  684.     memset(prf,0,sizeof(struct prefsdata));
  685.  
  686.     /* defaults */
  687.     prf->mainserver = "server.napster.com:8875";
  688.     prf->napvers = "Amster "AMSTER_VERSION;
  689.     prf->port = PRF_DEFAULT_PORT;
  690.     prf->email = "anon@napster.com";
  691.     prf->dlpath = "SYS:";
  692.     prf->link = 0;
  693.     prf->NameLength = 107;
  694.     prf->DownloadQueueLimit = 26;
  695.     prf->UploadQueueLimit = 2;
  696.     prf->UploadTaskPri = -1;
  697.     prf->QueueRetries = 180;
  698.     prf->QueueDelay = 20;
  699.     prf->regflag = 1;    /*  >:)  */
  700.     prf->noiconpanel = 1;
  701. }
  702.  
  703.  
  704. BOOL prf_load(char *fname)
  705. {
  706.     FILE *f;
  707.     char tmp[100], *s, *c;
  708.     int i;
  709.     u_long t;
  710.  
  711.     f=fopen(fname,"r");
  712.     if(f==0) return FALSE;
  713.  
  714.     while (fgets(tmp, sizeof(tmp), f)) {
  715.         s = strtok(tmp," ");
  716.         if (!s) {
  717.             continue;
  718.         }
  719.         else if (strcmp(s, "<search>")==0) {
  720.             while(fgets(tmp, sizeof(tmp), f)) {
  721.                 s = &tmp[0];
  722.                 c = nap_token(&s);
  723.                 if (!c) continue;
  724.                 else if(strcmp(c,"</search>")==0) break;
  725.                 else if(strcmp(c,"max")==0) {
  726.                     t = nap_ltoken(&s);
  727.                     if(t>2 && t<1000) prf->max = t;
  728.                 }
  729.                 else if(strcmp(c,"advopts")==0) {
  730.                     prf->speedqual   = nap_ltoken(&s);
  731.                     prf->speedval    = nap_ltoken(&s);
  732.                     prf->bitratequal = nap_ltoken(&s);
  733.                     prf->bitrateval  = nap_ltoken(&s);
  734.                     prf->freqqual    = nap_ltoken(&s);
  735.                     prf->freqval     = nap_ltoken(&s);
  736.                 }
  737.             }
  738.         } else if(strcmp(s,"iconpanel")==0) {
  739.             prf->noiconpanel = 0;
  740.         } else if(strcmp(s,"mainserver")==0) {
  741.             if(s=strtok(NULL,"\n")) prf->mainserver=strdup(s);
  742.         } else if(strcmp(s,"server")==0) {
  743.             if(s=strtok(NULL,"\n")) prf->server=strdup(s);
  744. /*
  745.         } else if(strcmp(s,"napvers")==0) {
  746.             if(s=strtok(NULL,"\n")) prf->napvers=strdup(s);
  747. */
  748.         } else if(strcmp(s,"listport")==0) {
  749.             if(s=strtok(NULL,"\n")) prf->port = atoi(s);
  750.         } else if(strcmp(s,"downloadqueue")==0) {
  751.             if(s=strtok(NULL,"\n")) prf->DownloadQueueLimit = atoi(s);
  752.         } else if(strcmp(s,"downloadpriority")==0) {
  753.             if(s=strtok(NULL,"\n")) prf->DownloadTaskPri = atoi(s);
  754.         } else if(strcmp(s,"uploadqueue")==0) {
  755.             if(s=strtok(NULL,"\n")) prf->UploadQueueLimit = atoi(s);
  756.         } else if(strcmp(s,"uploadpriority")==0) {
  757.             if(s=strtok(NULL,"\n")) prf->UploadTaskPri = atoi(s);
  758.         } else if(strcmp(s,"queueretries")==0) {
  759.             if(s=strtok(NULL,"\n")) prf->QueueRetries = atoi(s);
  760.         } else if(strcmp(s,"queuedelay")==0) {
  761.             if(s=strtok(NULL,"\n")) {
  762.                 t = atoi(s);
  763.                 if (t > 0) prf->QueueDelay = t;
  764.             }
  765.  
  766.         }
  767.         else if (strcmp(s,"script")==0) {
  768.             if (s=strtok(NULL," ")) {
  769.                 /* Old */
  770.                 i = atoi(s);
  771.                 if (i>0 && i<9 && (s=strtok(NULL,"\n")))
  772.                     prf->scripts[i-1] = strdup(s);
  773.                 /* New */
  774.                 else {
  775.                     if (strcmp(s, "startup") == 0 && (s = strtok(NULL, "\n"))) {
  776.                         prf->scripts[0] = strdup(s);
  777.                     } else if (strcmp(s, "exit") == 0 && (s = strtok(NULL, "\n"))) {
  778.                         prf->scripts[1] = strdup(s);
  779.                     } else if (strcmp(s, "connect") == 0 && (s = strtok(NULL, "\n"))) {
  780.                         prf->scripts[2] = strdup(s);
  781.                     } else if (strcmp(s, "disconnect") == 0 && (s = strtok(NULL, "\n"))) {
  782.                         prf->scripts[3] = strdup(s);
  783.                     } else if (strcmp(s, "dlfinish") == 0 && (s = strtok(NULL, "\n"))) {
  784.                         prf->scripts[4] = strdup(s);
  785.                     } else if (strcmp(s, "ulfinish") == 0 && (s = strtok(NULL, "\n"))) {
  786.                         prf->scripts[5] = strdup(s);
  787.                     } else if (strcmp(s, "transerror") == 0 && (s = strtok(NULL, "\n"))) {
  788.                         prf->scripts[6] = strdup(s);
  789.                     } else if (strcmp(s, "mp3play") == 0 && (s = strtok(NULL, "\n"))) {
  790.                         prf->scripts[7] = strdup(s);
  791.                     }
  792.                 }
  793.             }
  794.  
  795.         }
  796.         else if (strcmp(s,"sound")==0) {
  797.             if (s=strtok(NULL," ")) {
  798.                 /* Old */
  799.                 i = atoi(s);
  800.                 if (i>0 && i<8 && (s=strtok(NULL,"\n")))
  801.                     prf->sounds[i-1] = strdup(s);
  802.                 /* New */
  803.                 else {
  804.                     if (strcmp(s, "startup") == 0 && (s = strtok(NULL, "\n"))) {
  805.                         prf->sounds[0] = strdup(s);
  806.                     } else if (strcmp(s, "exit") == 0 && (s = strtok(NULL, "\n"))) {
  807.                         prf->sounds[1] = strdup(s);
  808.                     } else if (strcmp(s, "connect") == 0 && (s = strtok(NULL, "\n"))) {
  809.                         prf->sounds[2] = strdup(s);
  810.                     } else if (strcmp(s, "disconnect") == 0 && (s = strtok(NULL, "\n"))) {
  811.                         prf->sounds[3] = strdup(s);
  812.                     } else if (strcmp(s, "dlfinish") == 0 && (s = strtok(NULL, "\n"))) {
  813.                         prf->sounds[4] = strdup(s);
  814.                     } else if (strcmp(s, "ulfinish") == 0 && (s = strtok(NULL, "\n"))) {
  815.                         prf->sounds[5] = strdup(s);
  816.                     } else if (strcmp(s, "transerror") == 0 && (s = strtok(NULL, "\n"))) {
  817.                         prf->sounds[6] = strdup(s);
  818.                     } else if (strcmp(s, "mp3play") == 0 && (s = strtok(NULL, "\n"))) {
  819.                         prf->sounds[7] = strdup(s);
  820.                     }
  821.                 }
  822.  
  823.             }
  824.  
  825.         } else if(strcmp(s,"user")==0) {
  826.             if(s=strtok(NULL,"\n")) prf->user=strdup(s);
  827.         } else if(strcmp(s,"pass")==0) {
  828.             if(s=strtok(NULL,"\n")) prf->pass=strdup(s);
  829.         } else if(strcmp(s,"email")==0) {
  830.             if(s=strtok(NULL,"\n")) prf->email=strdup(s);
  831.         } else if(strcmp(s,"dlpath")==0) {
  832.             if(s=strtok(NULL,"\n")) prf->dlpath=strdup(s);
  833.         } else if(strcmp(s,"linktype")==0) {
  834.             if(s=strtok(NULL,"\n")) prf->link=atoi(s);
  835.         } else if(strcmp(s,"optclrlist")==0) {
  836.             prf->clrlist = 1;
  837.         } else if(strcmp(s,"autoconnect")==0) {
  838.             prf->autocon = 1;
  839.         } else if(strcmp(s,"fullpath")==0) {
  840.             prf->fullpath = 1;
  841.         } else if(strcmp(s,"alwaysaskfilename")==0) {
  842.             prf->askfile = 1;
  843.         } else if(strcmp(s,"autoaddshares")==0) {
  844.             prf->autoadd = 1;
  845.         } else if(strcmp(s,"autosaveshares")==0) {
  846.             prf->autosave = 1;
  847.         } else if(strcmp(s,"lamptype")==0) {
  848.             if(s=strtok(NULL,"\n")) prf->lamps=atoi(s);
  849.         } else if(strcmp(s,"autocleanup")==0) {
  850.             if(s=strtok(NULL,"\n")) prf->AutoCleanup=atoi(s);
  851.         } else if(strcmp(s,"serverlist")==0) {
  852.             if(s=strtok(NULL,"\n")) prf->ServerList=atoi(s);
  853.         } else if(strcmp(s,"namelength")==0) {
  854.             if(s=strtok(NULL,"\n")) {
  855.                 t = atoi(s);
  856.                 if (t > 7 && t < 108) prf->NameLength = t;
  857.             }
  858.         }
  859.     }
  860.     fclose(f);
  861.  
  862.     return TRUE;
  863. }
  864.  
  865.  
  866. void prf_save(char *fname)
  867. {
  868.     FILE *f;
  869.     u_long tmp;
  870.  
  871.     f=fopen(fname,"w");
  872.     if(f==0) {
  873.         gui_debug((char *)MSG_ERROR_SAVE);
  874.         return;
  875.     }
  876.  
  877.     GetAttr(MUIA_Menuitem_Checked,gui->iconpanelmenu,&tmp);
  878.     if (tmp==TRUE) fprintf(f,"iconpanel \n");
  879.  
  880.     /* Advanced */
  881.     if (prf->mainserver) fprintf(f, "mainserver %s\n", prf->mainserver);
  882.     if (prf->server) fprintf(f, "server %s\n", prf->server);
  883. /*
  884.     if (prf->napvers) fprintf(f, "napvers %s\n", prf->napvers);
  885. */
  886.     fprintf(f, "listport %d\n", prf->port);
  887.     fprintf(f, "downloadqueue %d\n", prf->DownloadQueueLimit);
  888.     fprintf(f, "downloadpriority %d\n", prf->DownloadTaskPri);
  889.     fprintf(f, "uploadqueue %d\n", prf->UploadQueueLimit);
  890.     fprintf(f, "uploadpriority %d\n", prf->UploadTaskPri);
  891.     fprintf(f, "queueretries %d\n", prf->QueueRetries);
  892.     fprintf(f, "queuedelay %d\n", prf->QueueDelay);
  893.  
  894.     /* User */
  895.     if (prf->user) fprintf(f,"user %s\n",prf->user);
  896.     if (prf->pass) fprintf(f,"pass %s\n",prf->pass);
  897.     if (prf->email) fprintf(f,"email %s\n",prf->email);
  898.     if (prf->dlpath) fprintf(f,"dlpath %s\n",prf->dlpath);
  899.     fprintf(f,"linktype %d\n",prf->link);
  900.  
  901.     /* Options */
  902.     if (prf->clrlist) fprintf(f,"optclrlist \n");
  903.     if (prf->autocon) fprintf(f,"autoconnect \n");
  904.     if (prf->fullpath) fprintf(f,"fullpath \n");
  905.     if (prf->askfile) fprintf(f,"alwaysaskfilename \n");
  906.     if (prf->autoadd) fprintf(f,"autoaddshares \n");
  907.     if (prf->autosave) fprintf(f,"autosaveshares \n");
  908.     fprintf(f, "lamptype %d\n", prf->lamps);
  909.     fprintf(f, "autocleanup %d\n", prf->AutoCleanup);
  910.     fprintf(f, "serverlist %d\n", prf->ServerList);
  911.     fprintf(f, "namelength %d\n", prf->NameLength);
  912.  
  913.     /* Events */
  914.  
  915.     /* Old */
  916. /*
  917.     for (i=0;i<8;i++) {
  918.         if(prf->scripts[i]) fprintf(f, "script %d %s\n", i+1, prf->scripts[i]);
  919.         if(prf->sounds[i]) fprintf(f, "sound %d %s\n", i+1, prf->sounds[i]);
  920.     }
  921. */
  922.     /* New */
  923.     if (prf->scripts[PRFE_STARTUP])    fprintf(f, "script startup %s\n",    prf->scripts[PRFE_STARTUP]   );
  924.     if (prf->sounds[PRFE_STARTUP])     fprintf(f, "sound startup %s\n",     prf->sounds[PRFE_STARTUP]    );
  925.     if (prf->scripts[PRFE_EXIT])       fprintf(f, "script exit %s\n",       prf->scripts[PRFE_EXIT]      );
  926.     if (prf->sounds[PRFE_EXIT])        fprintf(f, "sound exit %s\n",        prf->sounds[PRFE_EXIT]       );
  927.     if (prf->scripts[PRFE_CONNECT])    fprintf(f, "script connect %s\n",    prf->scripts[PRFE_CONNECT]   );
  928.     if (prf->sounds[PRFE_CONNECT])     fprintf(f, "sound connect %s\n",     prf->sounds[PRFE_CONNECT]    );
  929.     if (prf->scripts[PRFE_DISCONNECT]) fprintf(f, "script disconnect %s\n", prf->scripts[PRFE_DISCONNECT]);
  930.     if (prf->sounds[PRFE_DISCONNECT])  fprintf(f, "sound disconnect %s\n",  prf->sounds[PRFE_DISCONNECT] );
  931.     if (prf->scripts[PRFE_DLFINISH])   fprintf(f, "script dlfinish %s\n",   prf->scripts[PRFE_DLFINISH]  );
  932.     if (prf->sounds[PRFE_DLFINISH])    fprintf(f, "sound dlfinish %s\n",    prf->sounds[PRFE_DLFINISH]   );
  933.     if (prf->scripts[PRFE_ULFINISH])   fprintf(f, "script ulfinish %s\n",   prf->scripts[PRFE_ULFINISH]  );
  934.     if (prf->sounds[PRFE_ULFINISH])    fprintf(f, "sound ulfinish %s\n",    prf->sounds[PRFE_ULFINISH]   );
  935.     if (prf->scripts[PRFE_DLERROR])    fprintf(f, "script transerror %s\n", prf->scripts[PRFE_DLERROR]   );
  936.     if (prf->sounds[PRFE_DLERROR])     fprintf(f, "sound transerror %s\n",  prf->sounds[PRFE_DLERROR]    );
  937.     if (prf->scripts[PRFE_PLAYMP3])    fprintf(f, "script mp3play %s\n",    prf->scripts[PRFE_PLAYMP3]   );
  938.     if (prf->sounds[PRFE_PLAYMP3])     fprintf(f, "sound mp3play %s\n",     prf->sounds[PRFE_PLAYMP3]    );
  939.  
  940.     DoMethod(gui->searchpanel, SEARCH_GET);
  941.  
  942.     fprintf(f,"<search> \n");
  943.     fprintf(f,"advopts");
  944.     fprintf(f," %d",prf->speedqual);
  945.     fprintf(f," %d",prf->speedval);
  946.     fprintf(f," %d",prf->bitratequal);
  947.     fprintf(f," %d",prf->bitrateval);
  948.     fprintf(f," %d",prf->freqqual);
  949.     fprintf(f," %d\n",prf->freqval);
  950.     fprintf(f,"max %d\n",prf->max);
  951.     fprintf(f,"</search>\n");
  952.  
  953.     fclose(f);
  954. }
  955.  
  956.  
  957. void prf_entry(struct prfdata *data)
  958. {
  959.     u_long tmp,tmp2;
  960.  
  961.     GetAttr(MUIA_NList_EntryClick, data->EventList, &tmp);
  962.     set(data->EventScriptString, MUIA_Disabled, FALSE);
  963.     set(data->EventSoundString,  MUIA_Disabled, FALSE);
  964.     if (tmp==-1 || tmp==-2) return;
  965.  
  966.     if (data->lastitem != -1) {
  967.         int i = data->lastitem;
  968.         if (prf_eventflags[i]&1) {
  969.             GetAttr(MUIA_String_Contents, data->EventScriptString, &tmp2);
  970.             if (((char*)tmp2)[0]==0) prf->scripts[i]=NULL;
  971.             else prf->scripts[i]=strdup((char*)tmp2);
  972.         }
  973.         if (prf_eventflags[i]&2) {
  974.             GetAttr(MUIA_String_Contents, data->EventSoundString, &tmp2);
  975.             if (((char*)tmp2)[0]==0) prf->sounds[i]=NULL;
  976.             else prf->sounds[i]=strdup((char*)tmp2);
  977.         }
  978.     }
  979.     data->lastitem = tmp;
  980.  
  981.     set(data->EventScriptString, MUIA_String_Contents, prf->scripts[tmp]);
  982.     set(data->EventSoundString,  MUIA_String_Contents, prf->sounds[tmp]);
  983.  
  984.     if (!(prf_eventflags[tmp]&1))
  985.         set(data->EventScriptString, MUIA_Disabled, TRUE);
  986.     if (!(prf_eventflags[tmp]&2))
  987.         set(data->EventSoundString, MUIA_Disabled, TRUE);
  988. }
  989.  
  990.  
  991. void prf_event(enum Event no, ...)
  992. {
  993.     char *command;
  994.     char buf[1024];
  995.     va_list ap;
  996.     BOOL alloc = FALSE;
  997.  
  998.     if (prf_eventflags[no]&2 && prf->sounds[no])
  999.         snd_play(prf->sounds[no]);
  1000.  
  1001.     if (prf_eventflags[no]&1 && prf->scripts[no]) {
  1002.         va_start(ap, no);
  1003.         sprintf(buf, "Run <>NIL: %s", prf->scripts[no]);
  1004.  
  1005.         switch (no) {
  1006.             case PRFE_DLFINISH:
  1007.             case PRFE_ULFINISH:
  1008.             case PRFE_DLERROR:
  1009.             case PRFE_PLAYMP3:
  1010.                 command = strrep(buf, "%f", va_arg(ap, char *));
  1011.                 alloc = TRUE;
  1012.                 break;
  1013.             default:
  1014.                 command = buf;
  1015.         }
  1016.  
  1017.         Execute(command, 0, 0);
  1018.         va_end(ap);
  1019.         if (alloc) free(command);
  1020.     }
  1021. }
  1022.